package com.swyc.osschat.Test.designMode.adapter.run;

import com.swyc.osschat.Test.designMode.adapter.impl.SdAdapterTf;
import com.swyc.osschat.Test.designMode.adapter.impl.SdCardImpl;

/**
 * @description Java 适配器模式
 * 一、简介
 *  定义：将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
 *  适配器模式分为类结构型模式和对象结构型模式两种，前者类之间的耦合度比后者高，且要求程序员了解现有组件库中的相关组件的内部结构，所以应用相对较少些。
 *  主要角色：
 *      目标（Target）接口：当前系统业务所期待的接口，它可以是抽象类或接口。
 *      适配者（Adaptee）类：它是被访问和适配的现存组件库中的组件接口。
 *      适配器（Adapter）类：它是一个转换器，通过继承或引用适配者的对象，把适配者接口转换成目标接口，让客户按目标接口的格式访问适配者。
 * 二、 类结构型模式
 *  通过适配器以及上面的定义我们可以知道，适配器模式就是为了适配或兼容当前已有的类，因为我们原本的接口不兼容所导致类之间无法一起工作，适配器就是为了解决这一点，为了更好理解，我们先看未使用适配器模式之前的代码。
 *  举例：当前有一台电脑，可以读取和写入SD卡，先看代码实现。
 *  此时使用电脑读取和写入Sd卡中的数据就完成了。那么此时需求来了，我又想用电脑读取Tf卡中的数据，又不能修改现有的代码怎么办？接下来就要用适配器模式，来看代码：
 *  至此类结构型适配器已经完成了，简单理解就是说 我们为现有类提供了一个适配器类（SdAdapterTf），通过实现目标类的接口，实现里面的读写方法，并继承适配者类和调用适配者的读写方法完成了适配，是通过new Computer传入适配器，
 *  Computer构造方法接收SdCard的参数，因为适配器实现了SdCard，并调用适配者的方法，因为适配器也继承自TfCard，从而达到适配的效果。
 *  由此补充一点：只有当业务中存在一个接口规范的情况下才可以用。
 * 三、对象结构型模式
 *  对象结构型相比上面的类结构型只有适配器类(SdAdapterTf)发生了改变，类结构型采用继承的模式实现，而对象结构型采用聚合的模式实现。
 *  关于适配器模式的应用场景：
 *      之前开发的系统与现在新功能的接口不一致；
 *      第三方sdk中的接口和自己要求的接口定义不同时。
 * @Author: z156940l@outlook.com
 * @className Test
 * @Date: 2022/7/25 17:38
 */
public class Test {
    public static void main(String[] args) {
        onlySdCardUsed();
        onlyTfCardUsed();
    }

    /**
     * 仅仅sd卡
     */
    private static void onlySdCardUsed(){
        Computer computer = new Computer(new SdCardImpl());
        //读取数据
        String data = computer.readData();
        System.out.println(data);
        //写入数据
        computer.writrData("我是数据");
    }

    /**
     * 仅仅Tf卡
     */
    private static void onlyTfCardUsed(){
        Computer computer1 = new Computer(new SdAdapterTf());
        //读取数据
        String data1 = computer1.readData();
        System.out.println(data1);
        //写入数据
        computer1.writrData("我是数据");
    }
}
